package com.huawei.fakedouyin.dialog;

import android.content.Context;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.SeekBar;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatDialog;
import androidx.lifecycle.Observer;

import com.huawei.fakedouyin.R;
import com.huawei.fakedouyin.databinding.DialogDanmuSendBinding;
import com.huawei.fakedouyin.manager.PlayManager;
import com.huawei.fakedouyin.util.LiveDataSet;
import com.huawei.fakedouyin.util.LogUtil;
import com.huawei.fakedouyin.util.MainExecutor;
import com.huawei.fakedouyin.util.SPUtil;
import com.huawei.fakedouyin.util.ScreenUtilKt;
import com.huawei.faketaobao.constant.DMSettingText;
import com.huawei.faketaobao.constant.IConstant;
import com.huawei.faketaobao.constant.SPConstant;

/**
 * 弹幕移动速度速度、大小、透明度等设置弹框
 */
public class DanmuSetDialog extends AppCompatDialog {

    DialogDanmuSendBinding binding;
    private int size = 1;

    public DanmuSetDialog(@NonNull Context context) {
        super(context, R.style.BaseDialogTheme);
        initView();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().setGravity(Gravity.BOTTOM);
        ViewGroup.LayoutParams layoutParams = getWindow().getAttributes();
        layoutParams.width = ScreenUtilKt.screenWidth();
    }

    private void initView() {
        binding = DialogDanmuSendBinding.inflate(getLayoutInflater(), null, false);
        setContentView(binding.getRoot());
        //初始化速度
        binding.speedSeekBar.setProgress(25 * ((SPUtil.Companion.getInstance().getInt(SPConstant.moveSpeed, IConstant.moveSpeed) - IConstant.moveSpeedBase) - 1));
        updateSpeed(binding.speedSeekBar.getProgress());
        float font = Float.parseFloat(SPUtil.Companion.getInstance().getString(SPConstant.textSizeChange, IConstant.textSizeChange + "")) - IConstant.textSizeChangeBase;
        //字体大小转换为等级
        int fontInt = (int) (font * 10);
        binding.fontSeekBar.setProgress((fontInt - 1) * 25);
        updateFontSize(binding.fontSeekBar.getProgress());
        //初始化弹幕显示行数 设置seekbar的分段数
        binding.levelSeekBar.setCount(3);
        binding.levelSeekBar.setProgress((SPUtil.Companion.getInstance().getInt(SPConstant.maxLevel, IConstant.defaultLevel) - 1) * 33);
        updateMaxLevel(binding.levelSeekBar.getProgress());

        binding.danmuNum.setText(PlayManager.getInstance().getMyVideoView().dmItemList.size() + "条");
        //透明度
        binding.aplSeekBar.setProgress(Math.round(Float.parseFloat(SPUtil.Companion.getInstance().getInt(SPConstant.danmuAlpha, IConstant.textApl) + "") / IConstant.aplItem));
        updateApl(binding.aplSeekBar.getProgress());
        initClick();

    }

    /**
     * 恢复默认
     */
    private void reset() {
        //初始化速度
        binding.speedSeekBar.setProgress(25 * ((IConstant.moveSpeed - IConstant.moveSpeedBase) - 1));
        updateSpeed(binding.speedSeekBar.getProgress());
        float font = Float.parseFloat(IConstant.textSizeChange + "") - IConstant.textSizeChangeBase;
        //字体大小转换为等级
        int fontInt = (int) (font * 10);
        binding.fontSeekBar.setProgress((fontInt - 1) * 25);
        updateFontSize(binding.fontSeekBar.getProgress());

        binding.levelSeekBar.setCount(3);
        binding.levelSeekBar.setProgress((IConstant.defaultLevel - 1) * 33);
        updateMaxLevel(binding.levelSeekBar.getProgress());

        binding.aplSeekBar.setProgress(Math.round(Float.parseFloat(IConstant.textApl + "") / IConstant.aplItem));
        updateApl(binding.aplSeekBar.getProgress());
        //通知刷新
        LiveDataSet.changePlaySet.postValue(0);
        LiveDataSet.changePlaySet.postValue(1);
        LiveDataSet.changePlaySet.postValue(2);
        LiveDataSet.changePlaySet.postValue(3);
    }

    private void initClick() {
         //弹幕条数变化更新
        LiveDataSet.danmuSizeChange.observeForever(MainExecutor.get(), observer);
        //移动速度滑块
        binding.speedSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int i, boolean b) {

            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                //判断滑块位置
                binding.speedSeekBar.setProgress(updateProgress(binding.speedSeekBar.getProgress()));
                //进度转速度 刷新数据
                updateSpeed(binding.speedSeekBar.getProgress());
                //通知更新
                LiveDataSet.changePlaySet.postValue(0);
            }
        });

        //字体大小滑块
        binding.fontSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int i, boolean b) {

            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                //判断滑块位置 更新节点进度
                binding.fontSeekBar.setProgress(updateProgress(binding.fontSeekBar.getProgress()));
                //进度转换字体大小
                updateFontSize(binding.fontSeekBar.getProgress());
                LiveDataSet.changePlaySet.postValue(1);
            }
        });

        //通道数 弹幕显示行数滑块
        binding.levelSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int i, boolean b) {

            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                //判断滑块位置 更新节点进度
                binding.levelSeekBar.setProgress(updateProgressWith4(binding.levelSeekBar.getProgress()));
                //进度转换具体数值
                updateMaxLevel(binding.levelSeekBar.getProgress());
                //通知刷新
                LiveDataSet.changePlaySet.postValue(2);
            }
        });

        //透明度滑块
        binding.aplSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
                //进度转换透明度数值
                updateApl(i);
                //通知刷新
                LiveDataSet.changePlaySet.postValue(3);
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });

        //恢复默认
        binding.setReset.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                reset();
            }
        });
    }

    /**
     * 判断控制滑块位置
     * @param progress
     * @return
     */
    private int updateProgress(int progress) {
        int result;
        //25%为一个节点
        int index = (progress / 25) + 1;
        //滑块位置在空挡中的位置是否靠近下一个节点
        if (progress + 12 >= (index * 25)) {
            //靠更近下一个节点
            result = index * 25;
        } else {
            //上一个节点
            result = (index - 1) * 25;
        }
        //最后给出节点的进度
        return result;
    }

    /**
     * 判断滑块位置 四个节点
     * @param progress
     * @return
     */
    private int updateProgressWith4(int progress) {
        int result;
        //33%为一个节点
        int index = (progress / 33) + 1;
        //滑块位置在空挡中的位置是否靠近下一个节点
        if (progress + 16 >= (index * 33)) {
            //靠更近下一个节点
            result = index * 33;
        } else {
            //上一个节点
            result = (index - 1) * 33;
        }
        //最后给出节点的进度
        return result;
    }

    /**
     * 进度转速度数值
     * @param progress
     */
    private void updateSpeed(int progress) {
        //25%为一个节点  判断是第几个节点
        int level = (progress / 25) + 1;
        //速度为节点数值加上基本移动速度
        SPUtil.Companion.getInstance().put(SPConstant.moveSpeed, level + IConstant.moveSpeedBase);
        binding.speedTv.setText(DMSettingText.INSTANCE.getSpeedText(level));
    }

    /**
     * 进度转字体大小
     * @param progress
     */
    private void updateFontSize(int progress) {
        //25%为一个节点  判断是第几个节点   一共五个节点
        int temp = (progress / 25) + 1;
        //节点数值转float型 五个节点转换后分别是 0.1 0.2 0.3 0.4 0.5
        float level = Float.parseFloat(temp + "") / 10f;
        LogUtil.Companion.getInstance().logDebug("updateFontSize:" + level);
        //字体大小为转换后的数值加上基础数值0.7   中间的节点为0.3，加上0.7正好为1  即正常字体大小，不会对字体进行缩放
        SPUtil.Companion.getInstance().put(SPConstant.textSizeChange, (level + IConstant.textSizeChangeBase) + "");
        binding.fontTv.setText(DMSettingText.INSTANCE.getFontText(temp));
    }

    /**
     * 进度转换弹幕行数
     * @param progress
     */
    private void updateMaxLevel(int progress) {
        //33%为一个节点
        int level = (progress / 33) + 1;
        //节点数为弹幕显示行数
        SPUtil.Companion.getInstance().put(SPConstant.maxLevel, level);
        binding.levelTv.setText(level + "行");
    }

    /**
     * 进度转换透明度
     * @param progress
     */
    private void updateApl(int progress) {
        //最大进度为80%，   进度 * 2.55
        float apl = progress * IConstant.aplItem;
        //保存透明度
        SPUtil.Companion.getInstance().put(SPConstant.danmuAlpha, Math.round(apl));
        //可调节的为80%透明度  基础的透明度为20%
        binding.aplTv.setText((progress + 20) + "%");
    }

    private final Observer<Integer> observer = n -> {
        //弹幕条数变化更新
        binding.danmuNum.setText(n + "条");
    };

    @Override
    public void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        LiveDataSet.danmuSizeChange.removeObserver(observer);
    }
}
